Loading data

trade_df <- read.csv('https://raw.githubusercontent.com/Paul-scpark/Data_Mining_Practicum/main/data/Monthly_export_import.csv', header = T, fileEncoding = "euc-kr")
ISO_code <- read.csv('https://raw.githubusercontent.com/Paul-scpark/Data_Mining_Practicum/main/data/ISO_code.csv', header = T, fileEncoding = "euc-kr")
continent <- read.csv('https://raw.githubusercontent.com/Paul-scpark/Data_Mining_Practicum/main/data/continent_table.csv')

1. Preprocessing

str(trade_df)
## 'data.frame':    57209 obs. of  7 variables:
##  $ 기간    : num  2000 2000 2000 2000 2000 ...
##  $ 국가명  : chr  "미국" "일본" "중국" "홍콩" ...
##  $ 수출건수: chr  "43,994" "36,557" "28,795" "20,657" ...
##  $ 수출금액: chr  "2,633,770" "1,617,277" "1,293,695" "798,765" ...
##  $ 수입건수: chr  "52,999" "63,151" "31,458" "5,704" ...
##  $ 수입금액: chr  "2,217,025" "2,357,231" "1,008,166" "110,604" ...
##  $ 무역수지: chr  "416,745" "-739,954" "285,529" "688,160" ...
length(unique(trade_df$국가명))
## [1] 252
colSums(is.na(trade_df))
##     기간   국가명 수출건수 수출금액 수입건수 수입금액 무역수지 
##        0        0        0        0        0        0        0

‘수출입통계’ 데이터를 부른 후, str 함수를 통해서 전반적인 변수들의 type을 확인해본다.

또한 고유한 국가명들이 몇 개가 있는지, 각 변수 별로 NA가 있는지 확인한다.

trade_df$기간 <- as.character(trade_df$기간)
head(trade_df[str_length(trade_df$기간) != 7, ])
##        기간 국가명 수출건수  수출금액 수입건수  수입금액  무역수지
## 1918 2000.1   미국   55,691 3,645,843   63,307 2,529,401 1,116,442
## 1919 2000.1   일본   44,893 1,839,520   72,133 2,670,217  -830,697
## 1920 2000.1   중국   39,144 1,630,530   40,619 1,152,946   477,584
## 1921 2000.1   홍콩   26,508   967,684    6,330    98,381   869,302
## 1922 2000.1   대만    9,108   643,111   12,380   474,694   168,417
## 1923 2000.1   영국    8,737   484,301    6,105   198,384   285,917

우선 Date 형태로 바꿔주기 위하여 주어진 ‘기간’ 변수를 확인해본다.

기존 데이터의 형태는 ‘2000.01’ 형태이므로 str_length 함수로 문자열의 개수를 확인해보면, 7이 나와야 한다.

하지만, 위 결과처럼 문자열 개수가 7이 아닌 데이터들이 있음을 확인했다.

자세히 보니, 위 데이터는 10월인데, 맨 뒤의 0이 빠져서 1월처럼 표현이 되어 있는 것이다.

trade_df$기간 <- str_pad(trade_df$기간, width = 7, side = 'right', pad = '0')
trade_df$기간 <- as.Date(paste0(as.character(trade_df$기간), '.01'), format = '%Y.%m.%d')
head(unique(trade_df$기간), 12)
##  [1] "2000-01-01" "2000-02-01" "2000-03-01" "2000-04-01" "2000-05-01"
##  [6] "2000-06-01" "2000-07-01" "2000-08-01" "2000-09-01" "2000-10-01"
## [11] "2000-11-01" "2000-12-01"

따라서 str_pad 함수를 통해서 문자열의 개수를 7로 맞추고, 7이 아니면 맨 뒤에 0을 붙여준다.

그리고 Date 형태로 바꾸고 위하여 ‘2000.01’ 형태의 데이터에 날짜를 의미하는 ’.01’을 붙여준다.

이렇게 되면, 각 월 별로 ‘2000.01.01’, ‘2000.02.01’, ‘2000.03.01’ 형태의 데이터를 만든다.

이 과정을 통해 ‘기간’ 변수에 대한 unique 값을 확인해보면, 1월부터 12월까지 잘 나오는 것을 볼 수 있다.

trade_df[, 3:7] <- lapply(trade_df[, 3:7], gsub, pattern = ',', replacement = '')
trade_df[, 3:7] <- lapply(trade_df[, 3:7], as.double)
str(trade_df)
## 'data.frame':    57209 obs. of  7 variables:
##  $ 기간    : Date, format: "2000-01-01" "2000-01-01" ...
##  $ 국가명  : chr  "미국" "일본" "중국" "홍콩" ...
##  $ 수출건수: num  43994 36557 28795 20657 8618 ...
##  $ 수출금액: num  2633770 1617277 1293695 798765 604304 ...
##  $ 수입건수: num  52999 63151 31458 5704 11021 ...
##  $ 수입금액: num  2217025 2357231 1008166 110604 329643 ...
##  $ 무역수지: num  416745 -739954 285529 688160 274661 ...
head(trade_df)
##         기간 국가명 수출건수 수출금액 수입건수 수입금액 무역수지
## 1 2000-01-01   미국    43994  2633770    52999  2217025   416745
## 2 2000-01-01   일본    36557  1617277    63151  2357231  -739954
## 3 2000-01-01   중국    28795  1293695    31458  1008166   285529
## 4 2000-01-01   홍콩    20657   798765     5704   110604   688160
## 5 2000-01-01   대만     8618   604304    11021   329643   274661
## 6 2000-01-01   영국     6666   451356     4914   176783   274573

또한 ‘수출건수’ 부터 ‘무역수지’ 데이터는 수치형 변수인데, 콤마 등으로 인해 형 변환이 안되기 때문에 gsub 함수로 특수 문자를 제거한다.

그리고 lapply 함수를 통해서 multiple columns에 대하여 Double type으로 형 변환을 실시한다.

이를 통해 최종적으로 변수의 type을 str 함수를 통해서 확인할 수 있다.

2. Total export and import volumes of Korea

Total_export_import <- as.data.frame(left_join(aggregate(수출건수~기간, trade_df, sum), 
                                               aggregate(수입건수~기간, trade_df, sum), by = '기간'))
colnames(Total_export_import) <- c('Date', 'Total_export', 'Total_import')
head(Total_export_import, 12)
##          Date Total_export Total_import
## 1  2000-01-01       264434       246424
## 2  2000-02-01       249041       242902
## 3  2000-03-01       310423       292999
## 4  2000-04-01       300540       268231
## 5  2000-05-01       315463       283443
## 6  2000-06-01       309738       278232
## 7  2000-07-01       318080       280732
## 8  2000-08-01       297629       283252
## 9  2000-09-01       298912       269503
## 10 2000-10-01       328287       292171
## 11 2000-11-01       313126       288455
## 12 2000-12-01       309057       275773

수출입통계 데이터는 월별로 각 국가에 대해 대한민국의 수출, 수입 데이터를 정리한 것이다.

월별로 수출과 수입 데이터의 합을 구하면, 대한민국의 월별 전체 수출 및 수입량을 계산할 수 있다.

이를 위해서 aggregate 함수로 수출건수와 수입건수의 합을 구하고, ’기간’을 key 값으로 left_join 한다.

options("scipen" = 1000)
df_long <- melt(Total_export_import, id = 'Date')
ggplot(df_long, aes(x = Date, y = value, col = variable)) + geom_line()

그 후에는 X축을 Date로 하여 전체 수출(Total_export), 수입(Total_import)를 각각 그래프로 표시한다.

이를 통해 알 수 있는 것은 다음과 같다.

  1. 2000년부터 2021년까지 대한민국의 전체 수출량 및 수입량은 계속해서 증가하는 추세를 보인다.

  2. 대한민국은 전체 수출량보다, 전체 수입량이 더 많은 것을 확인할 수 있다.

  3. 2010년 이후 대한민국의 전체 수입량은 그 전에 비해서 급격히 증가하고 있다.

Total_export_import %>% 
  mutate(month = month(Date), 
         season = ifelse(month %in% c(3, 4, 5), '봄', 
                    ifelse(month %in% c(6, 7, 8), '여름', 
                      ifelse(month %in% c(9, 10, 11), '가을', '겨울')))) %>% 
  select(Total_export, Total_import, season) %>% 
  melt(id = 'season') %>% 
  ggplot(aes(x = factor(season), y = value, fill = variable)) +
  geom_boxplot() +
  ggtitle('계절별 수출 및 수입 건수의 합계') +
  theme(plot.title = element_text(hjust=0.5))

다음으로는 계절 별로 그룹을 나눠서 수출과 수입 건수의 합계가 차이가 있는지 확인해보도록 한다.

3~5월을 봄, 6~8월을 여름, 9~11월을 가을, 12~2월을 겨울로 하여 계절 별 수치에 대한 데이터를 boxplot으로 표현해본다.

그 결과는 그래프에서 알 수 있듯, 전반적으로 계절 별로 값의 큰 차이는 없는 것으로 확인할 수 있다.

Total_export_import %>% 
  mutate(year = year(Date)) %>% 
  group_by(year) %>% 
  summarise(yearly_export_sum = sum(Total_export), 
            yearly_import_sum = sum(Total_import), 
            yearly_export_mean = mean(Total_export), 
            yearly_import_mean = mean(Total_import)) %>% 
  melt(id = 'year') %>% 
  ggplot(aes(x = year, y = value, color = variable)) +
  geom_line() +
  ggtitle('연도별 수출, 수입 건수의 합계 및 평균') +
  theme(plot.title = element_text(hjust=0.5))

마지막으로는 연도 별로 수출과 수입 건수에 대한 추이를 확인해보도록 한다.

연도 별로 건수에 대한 합계와 평균을 구하여 그래프를 그려보았다.

전반적으로 수출과 수입 건수는 증가하는 모습을 보였고, 그 중 수입 건수는 상대적으로 수출 건수보다 더 급하게 상승하는 것을 볼 수 있다.

3. Impact of COVID-19 by Korea’s export and import

자료에 따르면, 전 세계에서 첫 코로나 환자 발생 시기는 2019년 12월이다.

그리고 이후, 2020년 1월 8일에는 대한민국에서 국내 첫 코로나 환자가 발생했다.

시간이 흘러서 계속해서 그 감염세가 확산됨에 따라 WHO는 2020년 3월에 팬데믹을 선포했다.

3.1 평균 수입 및 수출 건수

trade_df %>% 
  filter(기간 >= '2010-01-01') %>% 
  group_by(기간) %>% 
  summarise(mean_import = mean(수입건수), 
            mean_export = mean(수출건수)) %>% 
  gather(colname, value, 2:3) %>% 
  ggplot(aes(x = 기간, y = value, color = colname)) +
  geom_line(aes(color = colname)) + 
  geom_point(aes(color = colname), size = 0.2) +
  geom_vline(xintercept = as.numeric(ymd("2020-01-01")), 
             color = 'black', size = 1, alpha = 0.4) +
  ggtitle('대한민국의 평균 수입, 수출 건수') + 
  theme(plot.title = element_text(hjust=0.5))

코로나 바이러스가 대한민국의 수출입에 영향을 주는지 확인해보도록 한다.

가장 먼저는 수입과 수출 건수에 얼마나 영향을 줬는지 확인하기 위하여 그래프를 그려보았다.

또한 코로나의 영향도를 확인하기 위하여 국내에서 첫 환자가 발생했던 2020년 1월을 표시했다.

수입과 수출 건수는 2010년부터 2021년까지 꾸준히 증가하는 추세를 보이고 있다.

또한 코로나가 발생했던 2020년 1월 시점 역시, 감소하는 형태는 보이지 않는다.

3.2 평균 수입 및 수출 금액

trade_df %>% 
  filter(기간 >= '2010-01-01') %>% 
  group_by(기간) %>% 
  summarise(평균_수출금액 = mean(수출금액), 
            평균_수입금액 = mean(수입금액)) %>% 
  gather(colname, value, 2:3) %>% 
  ggplot(aes(x = 기간, y = value, color = colname)) +
  geom_line(aes(color = colname)) + 
  geom_point(aes(color = colname), size = 0.2) +
  geom_vline(xintercept = as.numeric(ymd("2020-01-01")), 
             color = 'black', size = 1) +
  facet_wrap(colname ~ ., ncol = 1) +
  ggtitle('대한민국의 평균 수입, 수출 금액') + 
  theme(plot.title = element_text(hjust=0.5))

평균 수입, 수출 금액에 대한 그래프도 확인해보았다.

수입과 수출 금액 데이터는 건수 데이터에 비해 상당히 변동성이 크게 움직이고 있다.

다만, 문제에서 확인하고자 하는 코로나가 발생했던 2020년 1월 경에는 수출입 금액이 모두 감소했다.

3.3 대한민국의 주요 무역국가들에 대하여 수출금액, 수입금액, 무역수지의 추이

trade_df %>% 
  filter(국가명 %in% c('미국', '중국', '일본', '베트남', '싱가포르', '대만'), 
         기간 >= '2010-01-01') %>% 
  select(기간, 국가명, 수출금액, 수입금액, 무역수지) %>% 
  gather(colname, value, 3:5) %>% 
  ggplot(aes(x = 기간, y = value, color = 국가명)) +
  geom_line(aes(color = 국가명)) + 
  geom_point(aes(color = 국가명), size = 0.1) +
  facet_wrap(colname ~ ., ncol = 1) +
  geom_vline(xintercept = as.numeric(ymd("2020-01-01")), 
             color = 'black', size = 1, alpha = 0.4)

그 다음으로는 대한민국의 주요 무역국가들에 대하여 수출과 수입에 대한 전반적인 추이를 비교해보도록 한다.

주요 무역 국가는 미국, 중국, 일본, 베트남, 싱가포르, 대만으로 했다.

무역수지와 수입 및 수출 금액에 대한 추이를 그래프를 통해서 확인해보도록 한다.

눈에 띄게 확인할 수 있는 것은 중국과 미국은 우리나라와 수입과 수출 금액이 약 20년동안 가장 높은 국가였다.

한편, 수출과 수입의 차이를 의미하는 무역수지 데이터에서 일본은 20년동안 음수였다는 것도 확인해볼 수 있다.

3.4 대한민국의 주요 무역국가들에 대하여 수출 및 수입 건수의 추이

trade_df %>% 
  filter(국가명 %in% c('미국', '중국', '일본', '베트남', '싱가포르', '대만'), 
         기간 >= '2010-01-01') %>% 
  select(기간, 국가명, 수출건수, 수입건수) %>% 
  gather(colname, value, 3:4) %>% 
  ggplot(aes(x = 기간, y = value, color = 국가명)) +
  geom_line(aes(color = 국가명)) + 
  geom_point(aes(color = 국가명), size = 0.1) +
  facet_wrap(colname ~ ., ncol = 1) +
  geom_vline(xintercept = as.numeric(ymd("2020-01-01")), 
             color = 'black', size = 1, alpha = 0.4)

마지막으로는 주요 무역국가들에 대한 수출과 수입 건수의 추이를 확인해보도록 한다.

수입에 대해서는 미국이 급격히 수입 건수 추이가 증가했다는 것을 볼 수 있으며, 코로나 직후에는 중국의 수입이 급격히 줄어들었다.

또한 코로나가 시작된 2020년 초반부터 우리나라가 일본에 대하여 수출한 건수가 점차적으로 증가하는 것도 확인할 수 있다.

4. Adding continent information

이 문제를 해결하기 위해서 여러 데이터를 합칠 때 고려해야 할 것은 다음과 같다.

ISO_code와 continent 데이터를 합쳐서 iso_code와 한국어와 영어로 된 국가 이름 그리고 대륙 이름 데이터를 얻는다.

그리고 이렇게 얻어진 데이터를 한국어 국가 이름을 기준으로 trade_df 데이터와 묶어준다.

하지만 여기서 고려해야 할 것은, 영어로 표기된 국가의 이름이 다를 수도, 한국어로 표기된 국가의 이름이 다를수도 있다는 것이다.

즉, 같은 나라이지만, 다른 표기법으로 인해 같은 나라지만 합쳐지지 않는 데이터가 있을 수 있다.

이를 고려하면서 작업을 수행하도록 한다.

ISO_code <- ISO_code %>% 
  select(ISO3, Korean, English) %>% 
  rename(iso_code = ISO3, location = English) %>% 
  mutate(Korean = gsub(' ', '', Korean))

continent$location <- toupper(continent$location)

head(ISO_code, 5)
##   iso_code   Korean location
## 1      GHA     가나    GHANA
## 2      GAB     가봉    GABON
## 3      GUY 가이아나   GUYANA
## 4      GMB   감비아   GAMBIA
## 5      GGY   건지섬 GUERNSEY
head(continent, 5)
##   iso_code continent    location
## 1      AFG      Asia AFGHANISTAN
## 2      ALB    Europe     ALBANIA
## 3      DZA    Africa     ALGERIA
## 4      AND    Europe     ANDORRA
## 5      AGO    Africa      ANGOLA

continent와 ISO_code 데이터를 통해서 trade_df에 대륙 정보를 추가하도록 한다. 한편, trade_df에 국가 정보들이 한국어로 되어 있다.

따라서 국가코드, 영어와 한국어로 나라 이름을 표기한 ISO_code 데이터를 continent와 합쳐서 대륙 정보를 추가한 후, trade_df에 합치도록 한다.

이를 위해서 가장 먼저, ISC_code 데이터에서 필요한 코드정보, 한국어와 영어로 국가 이름을 표현한 데이터만 추린다. 여기서 한국어는 공백을 제거해주도록 한다.

그리고 영어로 표기된 국가 정보들이 동일하게 비교되도록 모두 다 대문자로 바꿔주도록 한다.

length(unique(trade_df$국가명))
## [1] 252
c(length(unique(ISO_code$iso_code)), length(unique(ISO_code$Korean)))
## [1] 245 245
c(length(unique(continent$iso_code)), length(unique(continent$location)), length(unique(continent$continent)))
## [1] 206 206   6

그 후, 합치게 될 데이터들의 고유한 값들의 개수를 확인해준다.

최종적으로 합치게 될 trade_df의 국가 정보가 가장 많았고, 그리고 ISO_code, continent 데이터 순서였다.

length(intersect(ISO_code$iso_code, continent$iso_code))
## [1] 204
setdiff(continent$iso_code, ISO_code$iso_code)
## [1] "OWID_KOS" "OWID_CYN"
setdiff(ISO_code$iso_code, continent$iso_code)
##  [1] "GLP" "GUM" "NRU" "ATA" "ANT" "NFK" "NCL" "NIU" "REU" "MTQ" "MYT" "UMI"
## [13] "VIR" "BVT" "MNP" "SGS" "SPM" "ESH" "SJM" "ABW" "ASM" "VGB" "IOT" "ALA"
## [25] "WLF" "PRK" "CCK" "COK" "CXR" "KIR" "TKL" "TON" "TKM" "TUV" "PLW" "PRI"
## [37] "GUF" "ATF" "PYF" "PCN" "HMD"

join을 하기 전, 각 데이터들의 교집합과 차집합들의 값을 확인해보도록 한다.

가장 먼저, ISO_code와 continent 데이터에서 iso_code 값을 기준으로 교집합의 개수를 확인해보면, 204개가 나온다.

대륙의 정보를 담고 있는 continent 데이터가 206개였으므로, 2개를 제외하고는 모두 교집합이 있다는 것을 알 수 있다.

차집합으로 남은 2개를 확인하면, OWID_KOS와 OWID_CYN이 나오는 것을 알 수 있다. 이는 대륙 정보는 있지만, 한국 이름을 알기 어려운 국가이다.

한편, 반대로 차집합을 계산하면, 이 국가들은 한글 나라 이름은 알지만, 대륙 정보는 알 수 없는 국가들이다.

continent_df <- left_join(ISO_code, continent, by = 'iso_code')
dim(continent_df[!is.na(continent_df$continent), ])
## [1] 204   5

그렇다면, join을 한 후, 위의 내용이 맞는지 확인해보도록 한다.

iso_code를 기준으로 join을 하게 되면, 위에서 이야기한 교집합의 개수가 나와야 하고, dim 함수를 통해 204가 나오는 것을 알 수 있다.

continent_df %>% 
  filter(location.x != location.y) %>% 
  select(iso_code, Korean, location.x, continent) %>% 
  head(10)
##    iso_code           Korean                       location.x continent
## 1       SSD           남수단          REPUBLIC OF SOUTH SUDAN    Africa
## 2       KOR         대한민국               KOREA, REPUBLIC OF      Asia
## 3       TLS         동티모르                       EAST TIMOR      Asia
## 4       LAO           라오스 LAO PEOPLE'S DEMOCRATIC REPUBLIC      Asia
## 5       RUS           러시아               RUSSIAN FEDERATION    Europe
## 6       LBY           리비아           LIBYAN ARAB JAMAHIRIYA    Africa
## 7       MAC           마카오                            MACAU      Asia
## 8       MKD 마케도니아공화국            REPUBLIC OF MACEDONIA    Europe
## 9       MDA           몰도바             MOLDOVA, REPUBLIC OF    Europe
## 10      FSM 미크로네시아연방                       MICRONESIA   Oceania

한편, 이 국가들은 ISO_code와 continent의 나라 이름의 표기가 다른 국가들이다.

비록 나라 이름의 표기는 달랐으나, iso_code가 동일해서 같이 동일하게 묶어줄 수 있었다.

trade_df$국가명 <- gsub(' ', '', trade_df$국가명)
trade_df <- continent_df %>% 
              filter(!is.na(continent)) %>% 
              select(Korean, continent) %>% 
              rename(국가명=Korean) %>% 
              right_join(trade_df, by = '국가명')

head(trade_df, 10)
##    국가명 continent       기간 수출건수 수출금액 수입건수 수입금액 무역수지
## 1    가나    Africa 2000-01-01      217     4602        5      532     4070
## 2    가나    Africa 2000-02-01      185     4023        1        1     4022
## 3    가나    Africa 2000-03-01      238     4843        4      403     4440
## 4    가나    Africa 2000-04-01      178     3297        3      262     3034
## 5    가나    Africa 2000-05-01      184     4293        4      272     4021
## 6    가나    Africa 2000-06-01      208     4567        6      225     4342
## 7    가나    Africa 2000-07-01      162     4258        2      186     4072
## 8    가나    Africa 2000-08-01      165     3614        3      353     3262
## 9    가나    Africa 2000-09-01      151     6614        2      177     6437
## 10   가나    Africa 2000-10-01      181     4355        7      521     3834

최종적으로는 앞서 ISO_code와 continent로 만든 한국어 국가 정보와 대륙 정보를 담은 데이터로 trade_df를 join 한다.

unique(trade_df[is.na(trade_df$continent), ]$국가명)
##   [1] "중국"                     "대만"                    
##   [3] "호주"                     "태국"                    
##   [5] "아랍에미리트연합"         "러시아연방"              
##   [7] "포루투갈"                 "베네주엘라"              
##   [9] "기타국"                   "우즈베크"                
##  [11] "아프카니스탄"             "괌"                      
##  [13] "푸에르토리코"             "북마리아나군도"          
##  [15] "체코공화국"               "예맨"                    
##  [17] "이디오피아"               "사이프러스"              
##  [19] "에쿠아도르"               "코트디봐르"              
##  [21] "팔라우"                   "투르크멘"                
##  [23] "자마이카"                 "불령리유니온코모도제도"  
##  [25] "마티니크"                 "베닝"                    
##  [27] "마세도니아"               "도미니카"                
##  [29] "아메리칸사모아"           "아루바"                  
##  [31] "스와질랜드"               "불령폴리네시아"          
##  [33] "마다카스카르"             "마이크로네시아"          
##  [35] "과델로프"                 "뉴칼레도니아"            
##  [37] "마샬군도"                 "네덜란드열도"            
##  [39] "루안다"                   "콩고"                    
##  [41] "룩셈부르그"               "타지크"                  
##  [43] "에리트리아"               "베라루스"                
##  [45] "안티가바부다"             "벨리제"                  
##  [47] "영령캐이맨군도"           "앙귈라"                  
##  [49] "불령가이아나"             "보스니아-헤르체고비나"   
##  [51] "키리바티"                 "통가"                    
##  [53] "메요트"                   "투발루"                  
##  [55] "크리스마스아일랜드"       "노폴크아일랜드"          
##  [57] "상토메프린스페"           "미령버진군도"            
##  [59] "안타티카"                 "티모르"                  
##  [61] "챠드"                     "그린랜드"                
##  [63] "기네비소"                 "코모로스"                
##  [65] "북한"                     "솔로몬군도"              
##  [67] "세인트피레미켈론"         "세이쉘"                  
##  [69] "쿡아일랜드"               "투르크&카이코스군도"     
##  [71] "서사하라"                 "포클랜드군도"            
##  [73] "영령버진군도"             "왈라스&퓨투나군도"       
##  [75] "지브랄타"                 "허드앤맥도날드군도"      
##  [77] "마이너아우틀링합중국군도" "토켈라우"                
##  [79] "파로에군도"               "나우르"                  
##  [81] "불령남부지역"             "교황청"                  
##  [83] "코스군도"                 "피트카이른"              
##  [85] "팔레스타인해방기구"       "몬트세라트"              
##  [87] "영령인도양"               "남조지아&남샌드위치군도" 
##  [89] "니우에"                   "보네르신트외스타티위스"  
##  [91] "스발비드군도"             "보빗군도"                
##  [93] "세인트마틴"               "국제통화기금"            
##  [95] "저어지"                   "큐라소"                  
##  [97] "건지"                     "세인트바르탤르미"        
##  [99] "알랜드군도"               "해외교포"                
## [101] "세인트마틴(생마르탱)"

하지만 대륙 변수의 NA가 있는 국가들을 찾아보니 101개의 나라가 발견되었다.

또한 확인해보니, 중국과 대만, 호주, 태국 등과 같이 사람들에게 잘 알려진 국가들도 잘 merge가 된 것 같지 않았다.

따라서 각각의 데이터를 직접 확인해보니, 다음과 같이 한글 국가 이름 표기가 다른 것을 확인할 수 있었다.

한글 국가명 표기가 다른 국가들

# 건지섬 - 건지, 과들루프 - 과델로프, 그린란드 - 그린랜드, 나우루 - 나우르, 네덜란드 - 네덜란드열도, 도미니카공화국 - 도미니카, 
# 러시아 - 러시아연방, 르완다 - 루안다, 룩셈부르크 - 룩셈부르그, 마다가스카르 - 마다카스카르, 마르티니크 - 마티니크, 몬트세랫 - 몬트세라트, 
# 미국령버진아일랜드 - 미령버진군도, 베네수엘라 - 베네주엘라, 벨라루스 - 베라루스, 벨리즈 - 벨리제, 보스니아헤르체고비나 - 보스니아-헤르체고비나, 
# 북마리아나제도 - 북마리아나군도, 상투메프린시페 - 상토메프린스페, 세이셸 - 세이쉘, 솔로몬제도 - 솔로몬군도, 스와질란드 - 스와질랜드, 
# 아랍에미리트 - 아랍에미리트연합, 아프가니스탄 - 아프카니스탄, 앙골라 - 앙귈라, 에리트레아 - 에리트리아, 에콰도르 - 에쿠아도르, 
# 영국령인도양지역 - 영령인도양, 영국령버진아일랜드 - 영령버진군도, 예멘 - 예맨, 왈리스퓌튀나 - 왈라스&퓨투나군도, 
# 우즈베키스탄 - 우즈베크, 에티오피아 - 이디오피아, 자메이카 - 자마이카, 저지섬 - 저어지, 중화인민공화국 - 중국, 대만 - 중화민국, 
# 지브롤터 - 지브랄타, 차드 - 챠드, 체코 - 체코공화국, 코모로 - 코모로스, 코트디부아르 - 코드디봐르, 콩고공화국 - 콩고, 
# 크리스마스섬 - 크리스마스아일랜드, 키프로스 - 사이프러스, 타이 - 태국, 조선민주주의인민공화국 - 북한, 투르크메니스탄 - 투르크멘, 
# 팔레스타인 - 팔레스타인해방기구, 포르투갈 - 포루투갈, 포클랜드제도 - 포클랜드군도, 허드맥도널드제도 - 허드앤맥도날드군도, 오스트레일리아 - 호주
ISO_code <- 
  ISO_code %>% 
    mutate_all(~case_when(. == '건지섬' ~ '건지',  . == '과들루프' ~ '과델로프',  
                          . == '그린란드' ~ '그린랜드',  . == '나우루' ~ '나우르',  
                          . == '도미니카연방' ~ '도미니카',  
                          . == '러시아' ~ '러시아연방',  . == '르완다' ~ '루안다',  
                          . == '룩셈부르크' ~ '룩셈부르그',  . == '마다가스카르' ~ '마다카스카르',  
                          . == '마르티니크' ~ '마티니크',  . == '몬트세랫' ~ '몬트세라트',  
                          . == '미국령버진아일랜드' ~ '미령버진군도',  . == '베네수엘라' ~ '베네주엘라',  
                          . == '벨라루스' ~ '베라루스',  . == '벨리즈' ~ '벨리제',  
                          . == '보스니아헤르체고비나' ~ '보스니아-헤르체고비나',  . == '북마리아나제도' ~ '북마리아나군도',  
                          . == '상투메프린시페' ~ '상토메프린스페',  . == '세이셸' ~ '세이쉘',  
                          . == '솔로몬제도' ~ '솔로몬군도',  . == '스와질란드' ~ '스와질랜드',  
                          . == '아랍에미리트' ~ '아랍에미리트연합',  . == '아프가니스탄' ~ '아프카니스탄',  
                          . == '에리트레아' ~ '에리트리아',  
                          . == '에콰도르' ~ '에쿠아도르',  . == '영국령인도양지역' ~ '영령인도양',  
                          . == '영국령버진아일랜드' ~ '영령버진군도',  . == '예멘' ~ '예맨',  
                          . == '왈리스퓌튀나' ~ '왈라스&퓨투나군도',  . == '우즈베키스탄' ~ '우즈베크',  
                          . == '에티오피아' ~ '이디오피아',  . == '자메이카' ~ '자마이카',  
                          . == '저지섬' ~ '저어지',  . == '중화인민공화국' ~ '중국',  
                          . == '중화민국' ~ '대만',  . == '지브롤터' ~ '지브랄타',
                          . == '차드' ~ '챠드',  . == '체코' ~ '체코공화국',  
                          . == '코모로' ~ '코모로스',  . == '코트디부아르' ~ '코드디봐르',  
                          . == '크리스마스섬' ~ '크리스마스아일랜드',  
                          . == '키프로스' ~ '사이프러스',  . == '타이' ~ '태국',  
                          . == '조선민주주의인민공화국' ~ '북한',  . == '투르크메니스탄' ~ '투르크멘',
                          . == '팔레스타인' ~ '팔레스타인해방기구',  . == '포르투갈' ~ '포루투갈',
                          . == '포클랜드제도' ~ '포클랜드군도',  . == '허드맥도널드제도' ~ '허드앤맥도날드군도',
                          . == '오스트레일리아' ~ '호주', TRUE ~ .))

continent_df <- full_join(ISO_code, continent, by = 'iso_code')
trade_df <- trade_df[, c('국가명', '기간', '수출건수', '수출금액', '수입건수', '수입금액', '무역수지')]
trade_df <- continent_df %>% 
  filter(!is.na(continent)) %>% 
  select(Korean, continent) %>% 
  rename(국가명=Korean) %>% 
  right_join(trade_df, by = '국가명')

unique(trade_df[is.na(trade_df$continent), ]$국가명)
##  [1] "기타국"                   "괌"                      
##  [3] "푸에르토리코"             "북마리아나군도"          
##  [5] "코트디봐르"               "팔라우"                  
##  [7] "투르크멘"                 "불령리유니온코모도제도"  
##  [9] "마티니크"                 "베닝"                    
## [11] "마세도니아"               "아메리칸사모아"          
## [13] "아루바"                   "불령폴리네시아"          
## [15] "마이크로네시아"           "과델로프"                
## [17] "뉴칼레도니아"             "마샬군도"                
## [19] "네덜란드열도"             "콩고"                    
## [21] "타지크"                   "안티가바부다"            
## [23] "영령캐이맨군도"           "앙귈라"                  
## [25] "불령가이아나"             "키리바티"                
## [27] "통가"                     "메요트"                  
## [29] "투발루"                   "크리스마스아일랜드"      
## [31] "노폴크아일랜드"           "미령버진군도"            
## [33] "안타티카"                 "티모르"                  
## [35] "기네비소"                 "북한"                    
## [37] "세인트피레미켈론"         "쿡아일랜드"              
## [39] "투르크&카이코스군도"      "서사하라"                
## [41] "영령버진군도"             "왈라스&퓨투나군도"       
## [43] "허드앤맥도날드군도"       "마이너아우틀링합중국군도"
## [45] "토켈라우"                 "파로에군도"              
## [47] "나우르"                   "불령남부지역"            
## [49] "교황청"                   "코스군도"                
## [51] "피트카이른"               "영령인도양"              
## [53] "남조지아&남샌드위치군도"  "니우에"                  
## [55] "보네르신트외스타티위스"   "스발비드군도"            
## [57] "보빗군도"                 "세인트마틴"              
## [59] "국제통화기금"             "큐라소"                  
## [61] "세인트바르탤르미"         "알랜드군도"              
## [63] "해외교포"                 "세인트마틴(생마르탱)"
trade_df %>% 
  filter(기간 == '2000-01-01') %>% 
  select(-기간) %>% 
  head(10)
##      국가명     continent 수출건수 수출금액 수입건수 수입금액 무역수지
## 1      가나        Africa      217     4602        5      532     4070
## 2      가봉        Africa       10      176        6     1173     -997
## 3  가이아나 South America        2      145        0        0      145
## 4    감비아        Africa        0        0        2       63      -63
## 5  과테말라 North America      852    32898        9       43    32855
## 6  그레나다 North America        5       19        0        0       19
## 7    그리스        Europe      705   102737       51     1715   101022
## 8  그린랜드 North America        0        0        1       78      -78
## 9      기니        Africa       20      846        9    27747   -26901
## 10 나미비아        Africa        6      357        0        0      357

위에서 이야기 했던 것처럼 한글 국가명 표기가 다른 것들을 모두 통일한 후, 다시 수출입 데이터와 continent 데이터를 merge 해준다.

그리고 대륙 정보가 없는 국가를 다시 뽑아보면, 아까보다 소폭 준 64개 국가만 대륙 정보가 표기되지 못한 것을 알 수 있다.

수출입 데이터에 대륙 정보가 함께 저장된 데이터를 확인할 수 있다.

5. 대한민국과 무역을 가장 많이 하는 국가와 대륙

5.1 2000년부터 2021년까지 전체 기간에 대한 무역 건수 추이
trade_df %>%
  group_by(국가명, year(기간)) %>%
  mutate(yearly_total = sum(수출건수 + 수입건수), 
         yearly_import = sum(수입건수), 
         yearly_export = sum(수출건수)) %>% 
  select(continent, yearly_total, yearly_import, yearly_export) %>% 
  unique() %>% 
  group_by(continent) %>% 
  summarise(total_export_import = sum(yearly_total), 
         total_import = sum(yearly_import), 
         total_export = sum(yearly_export)) %>% 
  melt(id = 'continent') %>% 
  ggplot(aes(x = reorder(continent, -value), y = value, fill = variable)) +
  geom_bar(stat = "identity", color = 'black') +
  labs(title = "2000~2021년 대륙별 수출 및 수입건수 합계") + xlab("continent") +
  theme(plot.title = element_text(hjust=0.5), 
        axis.text.x=element_text(color = "black", size = 10, angle=30, vjust=.8, hjust=0.8))
## Adding missing grouping variables: `국가명`, `year(기간)`

대한민국과 가장 많이 무역을 하는 대륙은 어디인지 확인해보도록 한다.

먼저는 2000년부터 2021년까지 약 21년 동안 전체 수입과 수출 건수의 합 그리고 개별적인 수입과 수출 건수 각각의 합을 비교해보도록 한다.

이를 그래프로 표현하면 다음과 같음을 알 수 있다.

전체 무역건수(수출과 수입 건수의 합)가 가장 많은 대륙은 아시아 - 북아메리카 - 유럽 - 오세아니아 - 남아메리카 - 아프리카 순이다.

또한 수입건수가 많은 대륙은 북아메리카 - 아시아 - 유럽 - 오세아니아 - 남아메리카 - 아프리카 순이다.

수출건수의 경우에는 전체 무역건수의 대륙 순서와 동일하다.

북아메리카의 경우, 아시아에 비해서 수입건수는 많았지만, 수출건수가 낮아서 전체 무역 순위에서 밀린 것으로 확인된다.

trade_df %>%
  group_by(국가명, year(기간)) %>%
  mutate(yearly_total = sum(수출건수 + 수입건수), 
         yearly_import = sum(수입건수), 
         yearly_export = sum(수출건수)) %>% 
  select(continent, yearly_total, yearly_import, yearly_export) %>% 
  unique() %>% 
  group_by(continent) %>% 
  summarise(total_export_import = sum(yearly_total), 
            total_import = sum(yearly_import), 
            total_export = sum(yearly_export)) %>% 
  arrange(desc(total_export_import))
## Adding missing grouping variables: `국가명`, `year(기간)`
## # A tibble: 7 × 4
##   continent     total_export_import total_import total_export
##   <chr>                       <dbl>        <dbl>        <dbl>
## 1 Asia                    196636321    103272963     93363358
## 2 North America           128484578    105901984     22582594
## 3 Europe                   56866326     40049339     16816987
## 4 Oceania                  10640847      7993565      2647282
## 5 South America             3725379       857066      2868313
## 6 Africa                    3201853       474208      2727645
## 7 <NA>                       729671       287885       441786

2000년부터 2021년까지 전체 기간에 대한 대륙 별 통계값을 보면 다음과 같음을 확인할 수 있다.

trade_df %>%
  group_by(국가명, year(기간)) %>%
  mutate(yearly_total = sum(수출건수 + 수입건수), 
         yearly_import = sum(수입건수), 
         yearly_export = sum(수출건수)) %>% 
  select(continent, yearly_total, yearly_import, yearly_export) %>% 
  unique() %>% 
  group_by(국가명) %>% 
  summarise(total_export_import = sum(yearly_total), 
            total_import = sum(yearly_import), 
            total_export = sum(yearly_export)) %>% 
  arrange(desc(total_export_import)) %>% 
  head(10) %>% 
  melt(id = '국가명') %>% 
  ggplot(aes(x = reorder(국가명, -value), y = value, fill = variable)) +
  geom_bar(stat = "identity", color = 'black') +
  labs(title = "2000~2021년 대한민국과의 무역 건수 상위 10개국") + xlab("국가명") +
  theme(plot.title = element_text(hjust=0.5), 
        axis.text.x=element_text(color = "black", size = 10, angle=30, vjust=.8, hjust=0.8))
## Adding missing grouping variables: `국가명`, `year(기간)`

대륙이 아닌 개별 국가들 중에서 우리나라와 무역 건수가 높은 상위 10개 국가들도 확인해보도록 한다.

조금 주의 깊게 확인해볼 수 있는 것은 다음과 같다.

  • 미국은 우리나라의 수출보다 수입량이 압도적으로 많아 전체 무역 건수의 1순위이다.
  • 우리나라는 미국보다 중국에 대하여 수출량이 많다.
  • 독일은 우리나라가 수출을 많이 하지는 않지만, 수입을 많이해서 전체 무역 건수 4순위이다.
  • 중국, 일본, 홍콩, 베트남, 싱가포르 등 아시아 국가들의 무역 건수가 많음을 알 수 있다.
5.2 2018년부터 2021년까지 전체 기간에 대한 무역 건수 추이
trade_df %>%
  group_by(국가명, year(기간)) %>%
  mutate(yearly_total = sum(수출건수 + 수입건수), 
         yearly_import = sum(수입건수), 
         yearly_export = sum(수출건수)) %>% 
  filter(year(기간) >= 2018) %>% 
  select(continent, yearly_total, yearly_import, yearly_export) %>% 
  unique() %>% 
  group_by(continent) %>% 
  summarise(total_export_import = sum(yearly_total), 
            total_import = sum(yearly_import), 
            total_export = sum(yearly_export)) %>% 
  melt(id = 'continent') %>% 
  ggplot(aes(x = reorder(continent, -value), y = value, fill = variable)) +
  geom_bar(stat = "identity", color = 'black') +
  labs(title = "2018~2021년 대륙별 수출 및 수입건수 합계") + xlab("continent") +
  theme(plot.title = element_text(hjust=0.5), 
        axis.text.x=element_text(color = "black", size = 10, angle=30, vjust=.8, hjust=0.8))
## Adding missing grouping variables: `국가명`, `year(기간)`

앞선 그래프에서는 2000년부터 2021년의 약 21년동안의 긴 기간에 대한 무역 건수를 확인해보았다.

그렇다면, 비교적 최근 기간인 2018년부터 2021년의 대륙별 무역 건수 추이는 어떻게 변화할지 확인해보도록 한다.

위 과정과 동일하게 그래프를 표현해보면 다음과 같음을 알 수 있다.

확연하게 보이는 것은, 전체 기간에 대해 무역 건수가 가장 많은 대륙은 아시아였으나, 최근 기간에는 북아메리카로 바뀌었다.

그리고 그 이유는 최근 기간동안 북아메리카 대륙의 국가들에 대해 수입량이 압도적으로 많았음을 확인할 수 있다.

따라서 최근 기간의 무역 건수가 가장 많은 대륙의 순서는 북아메리카 - 아시아 - 유럽 - 오세아니아 - 아프리카 - 남아메리카 순이다.

수입 건수가 가장 많은 대륙의 순서는 북아메리카 - 아시아 - 유럽 - 오세아니아 - 남아메리카 - 아프리카 순이다.

수출 건수가 가장 많은 대륙의 순서는 아시아 - 북아메리카 - 유럽 - 아프리카 - 남아메리카 - 오세아니아 순이다.

아프리카 대륙의 수출 건수가 최근에 많이 증가한 것도 확인해볼 수 있다.

trade_df %>%
  group_by(국가명, year(기간)) %>%
  mutate(yearly_total = sum(수출건수 + 수입건수), 
         yearly_import = sum(수입건수), 
         yearly_export = sum(수출건수)) %>% 
  filter(year(기간) >= 2018) %>% 
  select(continent, yearly_total, yearly_import, yearly_export) %>% 
  unique() %>% 
  group_by(continent) %>% 
  summarise(total_export_import = sum(yearly_total), 
            total_import = sum(yearly_import), 
            total_export = sum(yearly_export)) %>% 
  arrange(desc(total_export_import))
## Adding missing grouping variables: `국가명`, `year(기간)`
## # A tibble: 7 × 4
##   continent     total_export_import total_import total_export
##   <chr>                       <dbl>        <dbl>        <dbl>
## 1 North America            57562530     51254240      6308290
## 2 Asia                     56171488     29288230     26883258
## 3 Europe                   19950005     16242251      3707754
## 4 Oceania                   4296055      3712062       583993
## 5 Africa                     964711       174076       790635
## 6 South America              840721       237806       602915
## 7 <NA>                       127344        37617        89727

2018년부터 2021년까지 전체 기간에 대한 대륙 별 통계값을 보면 다음과 같음을 확인할 수 있다.

trade_df %>%
  group_by(국가명, year(기간)) %>%
  mutate(yearly_total = sum(수출건수 + 수입건수), 
         yearly_import = sum(수입건수), 
         yearly_export = sum(수출건수)) %>% 
  filter(year(기간) >= 2018) %>% 
  select(continent, yearly_total, yearly_import, yearly_export) %>% 
  unique() %>% 
  group_by(국가명) %>% 
  summarise(total_export_import = sum(yearly_total), 
            total_import = sum(yearly_import), 
            total_export = sum(yearly_export)) %>% 
  arrange(desc(total_export_import)) %>% 
  head(10) %>% 
  melt(id = '국가명') %>% 
  ggplot(aes(x = reorder(국가명, -value), y = value, fill = variable)) +
  geom_bar(stat = "identity", color = 'black') +
  labs(title = "2018~2021년 대한민국과의 무역 건수 상위 10개국") + xlab("국가명") +
  theme(plot.title = element_text(hjust=0.5), 
        axis.text.x=element_text(color = "black", size = 10, angle=30, vjust=.8, hjust=0.8))
## Adding missing grouping variables: `국가명`, `year(기간)`

또한 최근 기간에 대해서 무역 건수가 많았던 상위 10개 국가들을 출력해보면 다음과 같다.

특별히 확인해볼 수 있는 것은 독일, 이탈리아, 영국 등 유럽 국가들이 조금 늘어난 것을 확인할 수 있다.

6. 2000년대 들어와서 우리나라와 무역 규모가 가장 크게 상승한 국가

std_df <- trade_df %>% 
            group_by(국가명, year(기간)) %>% 
            mutate(yearly_total = sum(수출건수 + 수입건수), 
                   yearly_import = sum(수입건수), 
                   yearly_export = sum(수출건수)) %>% 
            select(continent, yearly_total, yearly_import, yearly_export) %>% 
            unique() %>% 
            group_by(국가명) %>% 
            summarise(std = sd(yearly_total)) %>% 
            arrange(desc(std))
## Adding missing grouping variables: `국가명`, `year(기간)`
head(std_df, 10)
## # A tibble: 10 × 2
##    국가명        std
##    <chr>       <dbl>
##  1 미국     4792233.
##  2 중국     1912893.
##  3 일본      805871.
##  4 독일      789012.
##  5 베트남    351088.
##  6 이탈리아  230336.
##  7 호주      194278.
##  8 뉴질랜드  157978.
##  9 영국      131935.
## 10 대만      104353.
tail(std_df, 10)
## # A tibble: 10 × 2
##    국가명                 std
##    <chr>                <dbl>
##  1 불령남부지역         2.09 
##  2 피트카이른           1.92 
##  3 보빗군도             1.77 
##  4 세인트마틴(생마르탱) 1.71 
##  5 알랜드군도           1.58 
##  6 세인트피레미켈론     1.20 
##  7 허드앤맥도날드군도   1.10 
##  8 스발비드군도         0.943
##  9 서사하라             0.793
## 10 해외교포             0

2000년대 들어와서 우리나라와 무역 규모가 가장 크게 변화된 국가들을 확인해보도록 한다.

이를 위해서 연도별 수출 및 수입 건수의 합계 데이터에 대하여 각 국가별로 표준편차를 계산하도록 한다.

이를 통해 얼마나 그 값의 변동성이 컸는지 혹은 작았는지 그 분포를 확인해보도록 한다.

위 결과에서 확인할 수 있듯, 그 변동성이 가장 컸던 상위 10개 국가는 미국, 중국, 일본, 독일, 베트남 등이다.

또한 그 변동성이 가장 작았던 국가들은 불령남부지역, 피트카이른, 보빗군도, 세인트마틴 등이다.

그렇다면, 이 국가들의 실제 무역 추이에 대한 그래프를 통해서 이 값들을 직관적으로 확인해보도록 한다.

top_5 <- head(std_df, 5)$국가명
top_5
## [1] "미국"   "중국"   "일본"   "독일"   "베트남"
top_5 <- trade_df %>% 
          group_by(국가명, year(기간)) %>% 
          mutate(yearly_total = sum(수출건수 + 수입건수), 
                 yearly_import = sum(수입건수), 
                 yearly_export = sum(수출건수)) %>% 
          select(continent, yearly_total, yearly_import, yearly_export) %>% 
          unique() %>% 
          filter(국가명 %in% top_5) %>% 
          select(국가명, 'year(기간)', yearly_total)
## Adding missing grouping variables: `국가명`, `year(기간)`
ggplot(top_5, aes(x = `year(기간)`)) +
  geom_line(aes(y = yearly_total, col = 국가명))

무역 규모의 변동성이 컸던 상위 5개 나라(미국, 중국, 일본, 독일, 베트남)에 대한 그래프를 확인해보도록 한다.

2015년 이후에 무역 규모가 급격하게 증가한 국가는 미국이라는 것을 바로 확인할 수 있다.

또한 중국 역시 최근에 그 규모가 감소하긴 했으나, 그럼에도 불구하고 2000년에 비해서는 많이 증가한 것을 확인할 수 있다.

한편, 독일과 베트남, 일본 역시 매우 상승했으나 해당 그래프에서는 미국과 중국의 추이가 너무 급해서 잘 보이지 않는다.

따라서 해당 국가들의 추이를 따로 그래프를 그려서 다시 확인해보았다.

top_5 %>% 
  filter(국가명 %in% c('베트남', '일본', '독일')) %>% 
  ggplot(aes(x = `year(기간)`)) +
  geom_line(aes(y = yearly_total, col = 국가명))

y축의 범위가 백만 단위이므로, 베트남의 경우에는 2000년에 비해 약 1백만배 상승, 독일은 2.5백만배, 일본은 4백만배 정도 상승했다.

이를 통해서 독일과 베트남, 일본 국가들 역시 무역 규모가 상당히 커진 국가들이라는 것을 알 수 있다.

under_10 <- tail(std_df, 10)$국가명  
under_10
##  [1] "불령남부지역"         "피트카이른"           "보빗군도"            
##  [4] "세인트마틴(생마르탱)" "알랜드군도"           "세인트피레미켈론"    
##  [7] "허드앤맥도날드군도"   "스발비드군도"         "서사하라"            
## [10] "해외교포"
under_10 <- trade_df %>% 
              group_by(국가명, year(기간)) %>% 
              mutate(yearly_total = sum(수출건수 + 수입건수), 
                     yearly_import = sum(수입건수), 
                     yearly_export = sum(수출건수)) %>% 
              select(continent, yearly_total, yearly_import, yearly_export) %>% 
              unique() %>% 
              filter(국가명 %in% under_10) %>% 
              select(국가명, 'year(기간)', yearly_total)
## Adding missing grouping variables: `국가명`, `year(기간)`
ggplot(under_10, aes(x = `year(기간)`)) +
  geom_line(aes(y = yearly_total, col = 국가명))

무역 규모의 변동성이 작았던 상위 10개 나라에 대한 그래프를 확인해보도록 한다.

위에서 확인했던 무역 규모가 컸던 국가들에 대한 그래프와 다르게, 전반적으로 y축의 범위가 0부터 8 정도로 매우 적은 것을 알 수 있다.

그래프 상에서는 변동성이 커보이지만, y축의 범위를 상위 그래프의 범위와 동일하게 표시한다면 거의 움직임이 없을 것이다.

ggplot(under_10, aes(x = `year(기간)`)) +
  geom_line(aes(y = yearly_total, col = 국가명)) +
  ylim(0, 100)

실제로 y축의 범위를 0부터 100까지만 하더라도, 움직임이 거의 없는 것을 확인할 수 있다.

top_country <- trade_df %>% 
                 group_by(국가명) %>% 
                 summarise(Total_trade = sum(수출건수 + 수입건수)) %>% 
                 arrange(desc(Total_trade))

top_country
## # A tibble: 252 × 2
##    국가명   Total_trade
##    <chr>          <dbl>
##  1 미국       120785248
##  2 중국        83568169
##  3 일본        42241504
##  4 독일        22031038
##  5 홍콩        10976245
##  6 베트남      10176618
##  7 대만         9361947
##  8 싱가포르     6885447
##  9 이탈리아     6805737
## 10 호주         6451427
## # … with 242 more rows
summary(top_country)
##     국가명           Total_trade       
##  Length:252         Min.   :        2  
##  Class :character   1st Qu.:     2112  
##  Mode  :character   Median :    20932  
##                     Mean   :  1588432  
##                     3rd Qu.:   217847  
##                     Max.   :120785248

하지만 현재 나온 결과는 우리가 익히 들어봤거나, 쉽게 아는 국가들이 아니기 때문에 어느 정도 무역량이 있는 국가들만 추려서 다시 결과를 확인해보도록 한다.

이를 추리기 위해 수출건수와 수입건수의 합이 중앙값보다 큰 국가들만 추려서 해당 결과로 값을 확인해보도록 한다.

현재 결과를 보면, 중앙값이 20932로 나오는 것을 확인할 수 있다.

top_country <- top_country %>% 
                filter(Total_trade >= 20932) %>% 
                tail(10) %>% 
                select(국가명)

top_country
## # A tibble: 10 × 1
##    국가명          
##    <chr>           
##  1 베라루스        
##  2 세르비아        
##  3 트리니다드토바고
##  4 파푸아뉴기니    
##  5 피지            
##  6 몰도바          
##  7 볼리비아        
##  8 뉴칼레도니아    
##  9 기니            
## 10 아이슬란드

그래서 하위 10개 국가를 뽐으면, 기니, 벨라루스, 볼리비아, 세르비아 등의 나라가 나오는 것을 확인할 수 있다.

new_under_10 <- trade_df %>% 
                  group_by(국가명, year(기간)) %>% 
                  mutate(yearly_total = sum(수출건수 + 수입건수), 
                         yearly_import = sum(수입건수), 
                         yearly_export = sum(수출건수)) %>% 
                  select(continent, yearly_total, yearly_import, yearly_export) %>% 
                  unique() %>% 
                  filter(국가명 %in% as.vector(top_country$국가명)) %>% 
                  select(국가명, 'year(기간)', yearly_total)
## Adding missing grouping variables: `국가명`, `year(기간)`
ggplot(new_under_10, aes(x = `year(기간)`)) +
  geom_line(aes(y = yearly_total, col = 국가명))

따라서 이 국가들로 다시 그래프를 그려보면, 처음에 그렸던 그래프보다 그 범위가 조금 넓어진 것을 볼 수 있다.

하지만 그럼에도 불구하고, 가장 처음에 그렸던 상위 국가들에 비해서는 그 범위가 여전히 많이 작다는 것도 알 수 있다.

7. 집권한 정부마다의 무역량 변화 추이

인터넷 자료에 따르면, 2000년 이후 대한민국의 역대 정부는 위와 같음을 알 수 있다.

무역량 데이터는 2000년 이후 데이터이므로, 김대중 정부부터 현재 문재인 정부까지 역대 대통령과 정권 성향을 새로운 열로 만들어보도록 한다.

trade_df <- trade_df %>% 
              mutate(역대정부 = case_when(
                between(기간, as.Date('1998-02-25'), as.Date('2003-02-24')) ~ '김대중_정부',
                between(기간, as.Date('2003-02-25'), as.Date('2008-02-25')) ~ '노무현_정부',
                between(기간, as.Date('2008-02-26'), as.Date('2013-02-25')) ~ '이명박_정부',
                between(기간, as.Date('2013-02-26'), as.Date('2017-05-10')) ~ '박근혜_정부',
                between(기간, as.Date('2017-05-11'), as.Date('2022-05-09')) ~ '문재인_정부'), 
                    정권성향 = case_when(
                between(기간, as.Date('1998-02-25'), as.Date('2003-02-24')) ~ '진보',
                between(기간, as.Date('2003-02-25'), as.Date('2008-02-25')) ~ '진보',
                between(기간, as.Date('2008-02-26'), as.Date('2013-02-25')) ~ '보수',
                between(기간, as.Date('2013-02-26'), as.Date('2017-05-10')) ~ '보수',
                between(기간, as.Date('2017-05-11'), as.Date('2022-05-09')) ~ '진보'),      
                )
  
start <- trade_df %>% 
           filter(!duplicated(역대정부)) %>% 
           select(기간, 역대정부, 정권성향) %>%
           rename(start = 기간)

end <- trade_df %>% 
         arrange(desc(기간)) %>% 
         filter(!duplicated(역대정부)) %>% 
         select(기간, 역대정부, 정권성향) %>% 
         rename(end = 기간)

start_end <- right_join(start, end, by = c('역대정부', '정권성향'))
start_end <- start_end[, c('start', 'end', '역대정부', '정권성향')]
start_end
##        start        end    역대정부 정권성향
## 1 2000-01-01 2003-02-01 김대중_정부     진보
## 2 2003-03-01 2008-02-01 노무현_정부     진보
## 3 2008-03-01 2013-02-01 이명박_정부     보수
## 4 2013-03-01 2017-05-01 박근혜_정부     보수
## 5 2017-06-01 2021-07-01 문재인_정부     진보

위에서 찾은 역대 정부 결과를 바탕으로 역대정부와 정권성향을 담은 새로운 변수를 만든다.

그리고 각 정부 및 시기 별로 잘 들어갔는지 결과를 확인해보도록 한다.

palette(usecol(pal_unikn, n = 5))  
trade_df %>% 
  group_by(역대정부, 기간) %>% 
  summarise(전체수출건수 = sum(수출건수), 
            전체수입건수 = sum(수입건수)) %>% 
  melt(id=c('역대정부', '기간')) %>% 
  ggplot(aes(x = 기간, y = value, fill = variable)) +
  geom_rect(aes(xmin = as.Date('2000-01-01'), xmax = as.Date('2003-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau5, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2003-03-01'), xmax = as.Date('2008-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau4, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2008-03-01'), xmax = as.Date('2013-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau3, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2013-03-01'), xmax = as.Date('2017-05-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau2, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2017-06-01'), xmax = as.Date('2021-07-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau1, alpha = 0.01) +
  geom_line(aes(color = variable), size = 1) +
  geom_text(aes(x = as.Date('2000-01-01'), y = 3000000, label = 'DJ'), 
            size = 7, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2003-03-01'), y = 3000000, label = 'MH'), 
            size = 7, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2008-03-01'), y = 3000000, label = 'MB'), 
            size = 7, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2013-03-01'), y = 3000000, label = 'GH'), 
            size = 7, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2017-06-01'), y = 3000000, label = 'JI'), 
            size = 7, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  ggtitle('대한민국 각 정부별 전체 수출 및 수입 건수의 합계') + 
  theme(plot.title = element_text(hjust=0.5))
## `summarise()` has grouped output by '역대정부'. You can override using the `.groups` argument.

가장 먼저는 역대정부와 기간 별로 수출건수와 수입건수의 합으로 그래프를 그려보도록 한다.

또한 이 과정에서는 geom_rect 함수를 통해서 김대중 정부부터 문재인 정부까지 DJ, MH, MB, GH, JI로 표시하여 나눠보았다.

이 그래프는 전반적으로 우상향 하는 추이를 보이고 있어서 조금 더 구체적으로 주요 국가별로의 통계를 확인해보도록 한다.

trade_df %>% 
  filter(국가명 %in% c('미국', '중국', '일본', '러시아연방', 
                       '독일', '영국')) %>% 
  select(국가명, 기간, 무역수지) %>% 
  ggplot(aes(x = 기간, y = 무역수지, fill = 국가명)) +
  geom_rect(aes(xmin = as.Date('2000-01-01'), xmax = as.Date('2003-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau5, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2003-03-01'), xmax = as.Date('2008-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau4, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2008-03-01'), xmax = as.Date('2013-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau3, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2013-03-01'), xmax = as.Date('2017-05-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau2, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2017-06-01'), xmax = as.Date('2021-07-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau1, alpha = 0.01) +
  geom_line(aes(color = 국가명)) + 
  geom_text(aes(x = as.Date('2000-01-01'), y = 6500000, label = 'DJ'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2003-03-01'), y = 6500000, label = 'MH'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2008-03-01'), y = 6500000, label = 'MB'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2013-03-01'), y = 6500000, label = 'GH'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2017-06-01'), y = 6500000, label = 'JI'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  ggtitle('대한민국 각 정부별 주요 국가에 대한 무역수지 추이') + 
  theme(plot.title = element_text(hjust=0.5))

이번에는 미국, 중국, 일본, 러시아, 독일, 영국 등 주요 국가에 대해 우리나라의 무역수지 추이를 알아보도록 한다.

이 그래프 역시 위와 동일하게, 각 정권을 geom_rect으로 표현하여 정권 별로 차이가 있는지 확인해보도록 한다.

가장 먼저 눈에 띄는 것은 우리나라와 일본의 무역수지는 모든 정권에서 확연히 음수로 유지되고 있는 것을 확인할 수 있다.

또한 이명박 정부에서 대중 무역수지가 급격하게 증가한 것도 확실히 확인할 수가 있다.

그렇다면, 마지막으로는 우리나라와 무역수지가 가장 컸거나, 작았던 국가들을 확인해보도록 한다.

under_mean <- trade_df %>% 
                group_by(국가명) %>% 
                summarise(평균 = mean(무역수지)) %>% 
                arrange(평균) %>% 
                select(국가명) %>% 
                head(5)

top_mean <- trade_df %>% 
              group_by(국가명) %>% 
              summarise(평균 = mean(무역수지)) %>% 
              arrange(desc(평균)) %>% 
              select(국가명) %>% 
              head(5)

top_under <- rbind(top_mean, under_mean)
top_under
## # A tibble: 10 × 1
##    국가명        
##    <chr>         
##  1 중국          
##  2 홍콩          
##  3 미국          
##  4 베트남        
##  5 싱가포르      
##  6 일본          
##  7 사우디아라비아
##  8 카타르        
##  9 호주          
## 10 쿠웨이트

2000년부터 2020년까지 전체 무역수지의 평균이 가장 컸던 국가와 작았던 국가만을 먼저 찾는다.

trade_df %>% 
  filter(국가명 %in% top_mean$국가명) %>% 
  select(국가명, 기간, 무역수지) %>% 
  ggplot(aes(x = 기간, y = 무역수지, fill = 국가명)) +
  geom_rect(aes(xmin = as.Date('2000-01-01'), xmax = as.Date('2003-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau5, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2003-03-01'), xmax = as.Date('2008-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau4, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2008-03-01'), xmax = as.Date('2013-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau3, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2013-03-01'), xmax = as.Date('2017-05-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau2, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2017-06-01'), xmax = as.Date('2021-07-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau1, alpha = 0.01) +
  geom_line(aes(color = 국가명)) + 
  geom_text(aes(x = as.Date('2000-01-01'), y = 6500000, label = 'DJ'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2003-03-01'), y = 6500000, label = 'MH'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2008-03-01'), y = 6500000, label = 'MB'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2013-03-01'), y = 6500000, label = 'GH'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2017-06-01'), y = 6500000, label = 'JI'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  ggtitle('대한민국 각 정부별 주요 국가에 대한 무역수지 상위 국가 추이') + 
  theme(plot.title = element_text(hjust=0.5))

우리나라와 무역수지가 컸던 상위 5개 국가에 대한 무역수지 추이를 그래프로 표현해본다.

무역수지가 컸다는 것은 우리나라가 해당 국가에 수입보다, 수출을 많이 했다는 것으로 미국, 베트남, 싱가포르, 중국, 홍콩 국가이다.

미국을 제외하고는, 모두 아시아 국가이면서 우리나라와 근방에 있는 국가라는 것을 확인할 수 있다.

trade_df %>% 
  filter(국가명 %in% under_mean$국가명) %>% 
  select(국가명, 기간, 무역수지) %>% 
  ggplot(aes(x = 기간, y = 무역수지, fill = 국가명)) +
  geom_rect(aes(xmin = as.Date('2000-01-01'), xmax = as.Date('2003-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau5, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2003-03-01'), xmax = as.Date('2008-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau4, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2008-03-01'), xmax = as.Date('2013-02-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau3, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2013-03-01'), xmax = as.Date('2017-05-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau2, alpha = 0.01) +
  geom_rect(aes(xmin = as.Date('2017-06-01'), xmax = as.Date('2021-07-01'), 
                ymin = -Inf, ymax = Inf), fill = pal_unikn$seeblau1, alpha = 0.01) +
  geom_line(aes(color = 국가명)) + 
  geom_text(aes(x = as.Date('2000-01-01'), y = 2500000, label = 'DJ'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2003-03-01'), y = 2500000, label = 'MH'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2008-03-01'), y = 2500000, label = 'MB'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2013-03-01'), y = 2500000, label = 'GH'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  geom_text(aes(x = as.Date('2017-06-01'), y = 2500000, label = 'JI'), 
            size = 10, vjust = 0, hjust = 0, nudge_x = 50, check_overlap = TRUE) +
  ggtitle('대한민국 각 정부별 주요 국가에 대한 무역수지 하위 국가 추이') + 
  theme(plot.title = element_text(hjust=0.5))

우리나라와 무역수지가 작았던 상위 5개 국가는 사우디아라비아, 일본, 카타르, 쿠웨이트, 호주가 있다.

전반적으로 사우디아라비아, 카타르, 쿠웨이트는 산유국으로, 석유 수입이 많은 것으로 추정된다.

또한 호주는 석탄, 철광석, 구리 등 원자재 수입이 많아서 이러한 결과가 나온 것으로 추정된다.